//
//  TSCMyHttpUtil.m
//  Tsc_IOS
//
//  Created by Rio on 15-5-4.
//  Copyright (c) 2015年 idream. All rights reserved.
//

#import "TSCMyHttpUtil.h"
#import "TSCConstants.h"

#define LOG_PREFIX @"MyHttpUtil，"

@implementation TSCMyHttpUtil

/*
 * 发送异步POST请求。
 *
 * 注：早期发送异步请求使用delegate模式，即方法一；IOS 5之后增加了支持block回调的模式，即方法二。推荐采用方法二
 * 注：如果使用delegate模式，调用post()方法的代码不能在主线程中用[self performSelectorInBackground]；但如果使用block回调模式，则不受此限制
 *
 * @date 2015-05-05
 * @author Rio
 */
+(void) postWithUrl:(NSString *)urlString dictionary:(NSDictionary *)dictionary completionHandler:(void (^)(ServerRespType, NSString *, NSDictionary *, NSInteger, NSString *, NSDictionary *))block {
    //    // 方法一：使用代理（需在ViewController中实现NSURLConnectionDataDelegate协议）
    //    // 初始化一个NSURL对象
    //    NSURL *url = [NSURL URLWithString:urlString];
    //    // 将NSDictionary转换为NSData，并进行编码转换
    //    NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil];
    //    // 初始化一个请求
    //    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //    // 设置请求方法
    //    request.HTTPMethod = @"POST";
    //    // 15秒请求超时
    //    request.timeoutInterval = HTTP_TIMEOUT_INTERVAL_POST;
    //    // 设置请求体
    //    request.HTTPBody = jsonData;
    //    // 初始化一个连接（注：本句将自动开始连接）
    //    [NSURLConnection connectionWithRequest:request delegate:delegate];
    
    // 方法二：使用block
    // 初始化一个NSURL对象
    NSURL *url = [NSURL URLWithString:urlString];
    // 将NSDictionary转换为NSData，并进行编码转换
    NSData * jsonData = dictionary != nil ? [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil] : [NSJSONSerialization dataWithJSONObject:[NSDictionary dictionary] options:NSJSONWritingPrettyPrinted error:nil];
    // 初始化一个请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // 设置请求方法
    request.HTTPMethod = @"POST";
    // 60秒请求超时
    request.timeoutInterval = HTTP_TIMEOUT_INTERVAL_POST;
    // 设置请求体
    request.HTTPBody = jsonData;
    //创建一个新的队列（开启新线程）
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    //发送异步请求，请求完以后返回的数据，通过completionHandler参数来调用
    //    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:block];
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        // 判断服务器是否有返回
        if(!data) {
            NSLog(@"[E]%@服务器没有返回！错误信息：%@", LOG_PREFIX, connectionError);
            dispatch_async(dispatch_get_main_queue(), ^{
                block(ServerRespTypeErrNil, nil, nil, 0, @"", nil);
            });
            return;
        }
        
        // 尝试解析服务器返回（JSON格式）
        NSError * error = nil;
        NSString * respString = [[NSString alloc] initWithData:data encoding:O_ENCODING]; // 如果服务器返回的不是json格式的字符串，直接将data转换为字符串
        NSLog(@"respString:%@", respString); // TODO delete
        NSDictionary * respDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
        
        // 解析JSON失败
        if(error) {
            NSLog(@"[E]%@JSON解析失败！错误信息：%@，服务器返回：%@", LOG_PREFIX, error, [[NSString alloc]initWithData:data encoding:O_ENCODING]);
            dispatch_async(dispatch_get_main_queue(), ^{
                block(ServerRespTypeErrJson, respString, nil, 0, @"", nil);
            });
            return;
        }
        
        NSInteger code = [[respDic valueForKey:@"code"] intValue];
        NSString * msg = [respDic valueForKey:@"msg"];
        
        // 判断服务器返回结果
        if(!code) {
            NSLog(@"[E]%@服务器有返回失败！失败原因：%@", LOG_PREFIX, msg);
            dispatch_async(dispatch_get_main_queue(), ^{
                block(ServerRespTypeErrCode, respString, respDic, code, msg, nil);
            });
            return;
        }
        
        // 尝试解析content
        // 注：可能为nil
        // 注：有可能是Dictionary，也有可能是Array
        NSDictionary * contentDic = [respDic objectForKey:@"content"];
        NSLog(@"[D]%@POST<<--[Url:%@, Data:%@]", LOG_PREFIX, urlString, [[NSString alloc]initWithData:data encoding:O_ENCODING]);
        
        // 注：经实测，此时还在异步线程中，需要回到主线程中继续后续操作
        dispatch_async(dispatch_get_main_queue(), ^{
            block(ServerRespTypeSuccess, respString, respDic, code, msg, contentDic);
        });
    }];
    
    NSLog(@"[D]%@POST-->>[Url:%@, Data:%@]", LOG_PREFIX, urlString, [[NSString alloc]initWithData:jsonData encoding:O_ENCODING]);
}

/*
 * 发送异步GET请求。
 *
 * 注：参考POST完成，并且对服务器返回结果不解析，直接当做字符串返回（比如获得七牛token时使用）
 *
 * @date 2015-09-07
 * @author Rio
 */
+ (void) getWithUrl:(NSString *)urlString completionHandler:(void (^)(ServerRespType, NSString *))block {
    
    // 初始化一个NSURL对象
    NSURL *url = [NSURL URLWithString:urlString];
    // 初始化一个请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // 设置请求方法
    request.HTTPMethod = @"GET";
    // 60秒请求超时
    request.timeoutInterval = HTTP_TIMEOUT_INTERVAL_POST;
    // 设置请求体
    //    request.HTTPBody = jsonData;
    //创建一个新的队列（开启新线程）
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    //发送异步请求，请求完以后返回的数据，通过completionHandler参数来调用
    //    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:block];
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        // 判断服务器是否有返回
        if(!data) {
            NSLog(@"[E]%@服务器没有返回！错误信息：%@", LOG_PREFIX, connectionError);
            dispatch_async(dispatch_get_main_queue(), ^{
                block(ServerRespTypeErrNil, nil);
            });
            return;
        }
        
        // 尝试解析服务器返回（NSString格式）
        NSString * respString = [[NSString alloc]initWithData:data encoding:O_ENCODING];
        NSLog(@"[D]%@GET<<--[Url:%@, Data:%@]", LOG_PREFIX, urlString, respString);
        
        // 注：经实测，此时还在异步线程中，需要回到主线程中继续后续操作
        dispatch_async(dispatch_get_main_queue(), ^{
            block(ServerRespTypeSuccess, respString);
        });
    }];
    
    NSLog(@"[D]%@GET-->>[Url:%@]", LOG_PREFIX, urlString);
}

@end
